// main.go
package main

import (
	"fmt"
	"my-html-mini/utils"
	"os"
	"strings"

	"golang.org/x/net/html"
)

// minifyHTML 递归压缩 HTML 节点
func minifyHTML(n *html.Node) {
	// 可选：调试用，上线可注释
	// fmt.Printf("operation: data: %s\n", n.Data)

	// 安全遍历子节点（避免删除后断链）
	for node := n.FirstChild; node != nil; {
		next := node.NextSibling // 提前保存下一个节点
		if node.Type == html.CommentNode {
			node.Parent.RemoveChild(node) // 删除注释节点
		} else {
			minifyHTML(node) // 递归处理子节点
		}
		node = next
	}

	// 根据节点类型处理
	switch n.Type {
	case html.TextNode:
		n.Data = utils.CompactWhitespace(n.Data)
	case html.ElementNode:
		utils.CleanAttributes(n)
	}
}

func main() {
	// 读取输入文件
	data, err := os.ReadFile("index.html")
	if err != nil {
		fmt.Println("❌ 读取文件失败:", err)
		return
	}

	// 解析 HTML
	doc, err := html.Parse(strings.NewReader(string(data)))
	if err != nil {
		fmt.Println("❌ 解析 HTML 失败:", err)
		return
	}

	// 压缩处理
	minifyHTML(doc)

	// 渲染为字符串
	var buf strings.Builder
	if err := html.Render(&buf, doc); err != nil {
		fmt.Println("❌ 渲染 HTML 失败:", err)
		return
	}

	// 后处理：优化自闭合标签（移除 "/>" → ">"）
	minified := strings.ReplaceAll(buf.String(), "/>", ">")

	// 写入输出文件
	outputFile := "index.min.html"
	if err := os.WriteFile(outputFile, []byte(minified), 0644); err != nil {
		fmt.Println("❌ 写入文件失败:", err)
		return
	}

	fmt.Printf("✅ HTML 文件已成功压缩并保存为 %s\n", outputFile)
}
